/*******************************************************************************
 * Copyright 2011 @ Kapil Viren Ahuja
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 ******************************************************************************/
package com.kapil.framework.crypto;

import com.kapil.framework.lang.ArrayUtils;


/**
 * <p>
 * Computes a text digest using the <code>Salted Secure Hash Algorithm (SSHA)</code>. <code>SSHA</code> adds extra security
 * to the digest produced by <code>SHA-1</code> by adding a random string (<code>salt</code>) to it. Since the <code>salt</code>
 * is generated using another sufficiently random algorithm, the resultant digest is more secure than the original
 * <code>SHA-1</code> digest.
 * </p>
 */
public final class SaltedSecureHashDigester implements IDigester
{
    /**
     * <p>
     * Computes an <code>SSHA</code> digest of a text message.
     * </p>
     *
     * @param text A {@link java.lang.String} containing the text to be digested.
     * @return A printable {@link java.lang.String} digest.
     */
    public String digest(String text)
    {
        return addPrefix(getRawDigest(text));
    }

    /**
     * Adds prefix <code>{SHA}</code> to a digest if it is not blank.
     *
     * @param digest An array of bytes containing the digest value.
     * @return {@link java.lang.String} containing digest in Base-64 encoded form, with the algorith name prefixed.
     */
    public String addPrefix(byte[] digest)
    {
        return digest == null ? null : "{SSHA}" + Base64Util.encode(digest);
    }

    /**
     * Computes SSHA digest for a text message.
     *
     * @param text {@link java.lang.String} text.
     * @return An array of bytes containing the digest.
     */
    public byte[] getRawDigest(String text)
    {
        // Compute SHA-1 digest for the text.
        SecureHashDigester digester = new SecureHashDigester();
        byte[] digest = digester.getRawDigest(text);

        // If a non-null digest was obtained, add salt to it.
        if (digest != null)
        {
            // Obtain salt by computing a secure digest of current system time.
            byte[] salt = digester.getRawDigest(String.valueOf(System.currentTimeMillis()));

            // Append the salt to the digest.
            digest = ArrayUtils.mergeByteArrays(digest, salt);
        }

        return digest;
    }
}
